using LDNS.Utilities;
using LDNS.SDK.Commands.Models;

namespace LDNS.Commands
{
    /// <summary>
    /// 设置配置命令处理器
    /// 处理SET_CONFIG命令，设置DNS服务配置
    /// 作者：huobing
    /// </summary>
    public class SetConfigCommandHandler : CommandHandlerBase<SetConfigCommand, DefaultCommandResult>
    {
        /// <summary>
    /// 命令名称
    /// </summary>
    public override string CommandName => SetConfigCommand.NAME;
    
    /// <summary>
    /// 构造函数
    /// </summary>
    public SetConfigCommandHandler() { }
        
        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="args">命令参数，格式：key=value</param>
        /// <returns>执行结果</returns>
        public override BaseCommandResult Execute(string[] args)
        {
            try
            {
                // 允许设置的配置项列表（与GET_CONFIG返回的配置项对应）
                var allowedConfigKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
                {
                    "Port",                 // 监听端口
                    "enablecache",          // 启用缓存
                    "cacheexpirationminutes", // 缓存过期时间(分钟)
                    "maxconnections",       // 最大连接数
                    "enablesocketmanagement", // 启用Socket管理
                    "socketmanagementport", // Socket管理端口
                    "enablerecordpersistence", // 启用记录持久化
                    "enableaccesscontrol", // 启用访问控制
                    "allowedips", // 允许的IP列表
                    "defaultrecordttl", // 默认记录TTL(秒)
                    "upstreamdnsservers", // 上游DNS服务器列表
                };
                
                
                // 处理每个key=value参数
                foreach (var arg in args)
                {
                    var parts = arg.Split('=', 2);
                    string key = parts[0].ToLower();
                    string value = parts[1];
                    
                    // 验证配置项是否允许设置
                    if (!allowedConfigKeys.Contains(key))
                    {
                        return CreateErrorResult($"参数 '{key}' 不是有效的配置项。请使用GET_CONFIG查看可用的配置项。");
                    }
                }
                // 处理每个key=value参数
                foreach (var arg in args)
                {
                    var parts = arg.Split('=', 2);
                    string key = parts[0].ToLower();
                    string value = parts[1];
                    
                    // 其他配置项正常保存
                    DnsConfigManager.Instance.Setting(key, value);
                }
                DnsConfigManager.Instance.SaveConfig();
                return CreateSuccessResult("配置已更新成功");
            }
            catch (System.Exception ex)
            {
                return CreateErrorResult($"设置配置失败: {ex.Message}");
            }
        }
    }
}